package com.dingwen.treasure.kettle.base.annotation;


import com.dingwen.treasure.kettle.enums.RequestParamEnum;
import com.dingwen.treasure.kettle.constant.RedisConstant;
import com.dingwen.treasure.kettle.constant.TipsConstant;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * 防止重复提交 <br>
 * <p>key的生成规则： 全类名:方法名:参数类型:userId(可选配置):参数.toString()</p>
 *
 * @author dingwen
 * @date 2022/04/04
 */
@Documented
@Inherited
@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface ReSubmit {
    /**
     * 防止重复提交的redis存储Key
     *
     * @return {@link String}
     */
    String key() default RedisConstant.RE_SUBMIT_KEY;


    /**
     * 从request中获取请求参数
     *
     * @return {@link String}
     */
    String param() default "";


    /**
     * 参数类型 <br>
     * <p>
     * 默认值： {@link RequestParamEnum#BODY} 请求体类型
     * </p>
     *
     * @return {@link RequestParamEnum}
     */
    RequestParamEnum paramType() default RequestParamEnum.BODY;


    /**
     * 防止重复提交的时间 <br>
     * <p>
     * 默认值： 2 秒，即两秒钟之内不能再次发起请求
     * </p>
     *
     * @return int
     */
    long time() default 2L;

    /**
     * 防止重复提交的时间单位 <br>
     * <p>
     * 默认值：{@link TimeUnit#SECONDS} 秒
     * </p>
     *
     * @return {@link TimeUnit}
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;


    /**
     * 是删除键 <br>
     * <pre>
     *     1. false:  key只有在redis的key的有效期到了才会进行删除
     *     2. true: 当次请求结束处理完毕进行删除
     *     3. 默认值为true，即进行删除
     * </pre>
     *
     * @return boolean
     */
    boolean isDeleteKey() default true;


    /**
     * key的生成策略，是否拼接用户ID
     *
     * @return boolean
     */
    boolean isAppendUserId() default true;


    /**
     * 触发重复提交被拦截时，返回给客户端的友好提示信息
     *
     * @return {@link String}
     */
    String message() default TipsConstant.RE_SUBMIT_TIPS;

}
